﻿
namespace ShoppingCart.WebSite.Admin
{
    using System;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Business.Entity.Collections;
    using Code;
    using DTO = Business.Entity;

    public partial class Administradores : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack) return;
            CargarAdministradores();
        }

        protected void LvAdministradoresItemCommand(object sender, ListViewCommandEventArgs e)
        {
            switch (e.CommandName)
            {
                case "Insert":
                    AgregarAdministrador(e.Item);
                    break;
                case "Update":
                    ModificarAdministrador(e.CommandArgument.ToString(), e.Item);
                    break;
                case "Delete":
                    EliminarAdministrador(e.CommandArgument.ToString());
                    break;
            }
        }

        protected void LvAdministradoresItemEditing(object sender, ListViewEditEventArgs e)
        {
            lvAdministradores.EditIndex = e.NewEditIndex;
            CargarAdministradores();
        }

        protected void LvAdministradoresItemCanceling(object sender, ListViewCancelEventArgs e)
        {
            switch (e.CancelMode)
            {
                case ListViewCancelMode.CancelingEdit:
                case ListViewCancelMode.CancelingInsert:
                    lvAdministradores.EditIndex = -1;
                    break;
                default:
                    break;
            }
            CargarAdministradores();
        }

        protected void LvAdministradoresItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
            // Sin codigo evitando la actualización por defecto
        }

        protected void LvAdministradoresItemInserting(object sender, ListViewInsertEventArgs e)
        {
            // Sin codigo evitando la actualización por defecto
        }

        protected void LvAdministradoresItemUpdating(object sender, ListViewUpdateEventArgs e)
        {
            // Sin codigo evitando la actualización por defecto
        }

        private void CargarAdministradores()
        {
            var users = Roles.GetUsersInRole("Administrador");
            var administardores = new UsuarioCollection();
            foreach (var username in users)
            {
                var user = Membership.GetUser(username);
                administardores.Add(new DTO.Usuario
                    {   
                        Username = username,
                        Email = user.Email,
                        CreationDate = user.CreationDate,
                        LastLoginDate = user.LastLoginDate
                    });
            }
            BindControl<DTO.Usuario>.BindListView(lvAdministradores, administardores);
        }

        private void AgregarAdministrador(ListViewItem item)
        {
            var username = ((TextBox)item.FindControl("txtUsername")).Text;
            var password = ((TextBox)item.FindControl("txtPassword")).Text;
            var email = ((TextBox)item.FindControl("txtEmail")).Text;
            MembershipCreateStatus status;
            MembershipUser user = Membership.CreateUser(username, password, email, null, null, true, out status);
            if (user != null)
            {
                Roles.AddUserToRole(username, "Administrador");
                lvAdministradores.EditIndex = -1;
                CargarAdministradores();
            }
            else
            {
                var mensaje = string.Empty;
                switch (status)
                {
                    case MembershipCreateStatus.DuplicateEmail:
                        mensaje = "El correo electrónico existe.";
                        break;
                    case MembershipCreateStatus.DuplicateUserName:
                        mensaje = "El nombre del usuario existe.";
                        break;
                    case MembershipCreateStatus.ProviderError:
                        mensaje = "Existe un error en el proveedor.";
                        break;
                    case MembershipCreateStatus.InvalidPassword:
                        mensaje = "La contraseña no es correcta. Usted necesita una contraseña de 6 letras como minimo.";
                        break;
                    default:
                        mensaje = "El usuario no fue creado. Mensaje: " + status;
                        break;
                }
                ScriptManager.RegisterStartupScript(upnActualizar, GetType(), "MensajeError", "alert('" + mensaje + "');", true);
            }
        }

        private void ModificarAdministrador(string username, ListViewItem item)
        {
           var email = ((TextBox)item.FindControl("txtEmail")).Text;
           var user = Membership.GetUser(username);
           user.Email = email;
           Membership.UpdateUser(user);
           lvAdministradores.EditIndex = -1;
           CargarAdministradores();
        }

        private void EliminarAdministrador(string username)
        {
            Membership.DeleteUser(username);
            CargarAdministradores();
        }
    }
}
